<?php

namespace core\lib;


use core\config\Config;
use core\exception\CommonException;

class Handle
{
    /**
     * 处理异常的方法
     * 注 所有的异常都需要经过该方法处理后直接返回
     * 为了方便调试 所有的非生产环境下该方法都会返回具体的错误信息
     * 调用格式
     * try{
     *     // do something
     * }catch (\Exception $e){
     *     // handle exception
     *    return Handle::handleException($e);
     * }
     * @param \Exception $e
     * @param string $category 允许自定义指定日志类型默认的applicant
     * @param string $defaultMsg
     * @return array
     */
    public static function handleException($e, $category = 'applicant', $defaultMsg = '系统异常')
    {
        // 异常信息记录到日志中
        \Yii::error($e->__toString(), $category);

        if ($e instanceof CommonException) {
            /**
             * 如果是CommonException 可能还会返回data回来
             * 在抛出异常的时候允许用户在code参数后面传入data 参数
             * 若data为非空 则会将data返回
             */
            return $e->handleException();
        }
        $out = ['code' => $e->getCode()];
        // 如果不是线上环境 直接将错误信息返回 方便调试
        if (!Config::isProduct()) {
            $out['msg'] = $e->__toString();
        } else {
            $out['msg'] = $defaultMsg;
        }
        return $out;
    }
}